package ar.edu.utn.frsf.tpae.a2014.g01.dao.impl;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import ar.edu.utn.frsf.tpae.a2014.g01.dao.PedidoDAO;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Cliente;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Estado;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Pedido;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Transportista;

@Component
public class PedidoHibernateDAO implements PedidoDAO {

	
	private SessionFactory sessionFactory;

	  @Autowired(required = true)
	  public void setSessionFactory(SessionFactory factory) {
	    this.sessionFactory = factory;
	  }

	  private Session getCurrentSession() {
	    return sessionFactory.getCurrentSession();
	  }

	@Override
	public void crearPedido(Pedido pedido) {
		getCurrentSession().save(pedido);
	    
	}

	@Override
	public void actualizarPedido(Pedido pedido) {
		getCurrentSession().saveOrUpdate(pedido);


	}

	@Override
	public List<Pedido> buscarPedidos(Estado estado) { //XXX not null para cliente transportista y administrador?

		
		List list = getCurrentSession().createQuery("SELECT p FROM Pedido p, HistorialPedido h WHERE h.pedido.id=p.id "+
				 "and h.id=(SELECT max(h2.id) FROM HistorialPedido h2 WHERE h2.pedido.id=p.id) and h.estado='"+estado+"'").list();

	    return list;

	}

	@Override
	public void eliminar(Pedido pedido) {

		getCurrentSession().delete(pedido);

	}

	@Override
	public List<Pedido> buscarPedidosRealizados(Cliente cl) {

	    List list = getCurrentSession().createQuery("FROM Pedido WHERE cliente.id="+cl.getId()).list();

	    return list;
	}

	@Override
	public List<Pedido> buscarPedidosAsignados(Transportista transportista) {
	    List list = getCurrentSession().createQuery("SELECT p FROM Pedido p, HistorialPedido h WHERE h.pedido.id=p.id "
	    		+ " and h.id=(SELECT max(h2.id) FROM HistorialPedido h2 WHERE h2.pedido.id=p.id) and "
	    		+ " (h.estado='A_RETIRAR' or h.estado='EN_TRANSPORTE') and p.transportista.id="+transportista.getId()).list();
	  
	    return list;
	}

	@Override
	public void asignarPedidoaTransportista(Pedido pedido,
			Transportista transportista) {
		
		getCurrentSession().saveOrUpdate(pedido);
	}

	@Override
	public void actualizarEstadoOrden(Pedido pedido) {

		getCurrentSession().saveOrUpdate(pedido);
		
	}

	}
